package com.example.mapstuct.convert;

import com.example.mapstuct.entity.User;
import com.example.mapstuct.pojo.dto.UserDTO;
import com.example.mapstuct.pojo.vo.UserVO;
import com.example.mapstuct.util.ConvertUtil;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

import java.util.List;
import java.util.Map;

/**
 * 自定义转换
 * 高阶用法
 *
 * @author Lisicheng
 */
// 当转换类使用的构建方式为spring时，使用的工具类也必须在spring容器中。使用的工具类构建方式会同转换类一致。
@Mapper(componentModel = "spring", uses = {ConvertUtil.class})
public interface CustomizeConvert {

    CustomizeConvert INSTANCE = Mappers.getMapper(CustomizeConvert.class);

    /**
     * 使用自定义工具方法
     *
     * @param userDTO 源对象
     * @return 转换对象
     */
    @Mapping(source = "time", target = "createTime", qualifiedByName = "strToLocalDateTime")
    @SuppressWarnings("all")
    User userDTOToUser(UserDTO userDTO);

    /**
     * 反转转换
     *
     * @param user 源对象
     * @return 转换对象
     */
    @InheritInverseConfiguration(name = "userDTOToUser")
    UserDTO userToUserDTO(User user);

    /**
     * 迭代转换
     *
     * @param list Integer
     * @return list String
     */
    @IterableMapping(elementTargetType = String.class)
    List<String> iterableMapping(List<Integer> list);

    /**
     * 迭代转换
     * 自定义工具类方法
     *
     * @param list 源对象
     * @return 转换对象
     */
    @IterableMapping(qualifiedByName = "intToStr")
    List<String> iterableMappingByQualifiedByName(List<Integer> list);

    /**
     * map相互转换
     *
     * @param map 源map
     * @return 转换map
     */
    @MapMapping(keyQualifiedByName = "longToStr")
    Map<String, UserVO> mapMapping(Map<Long, User> map);


    // UserVO userToUserVO(User user);


}
